package br.com.damazzy.negocio.servico;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import br.com.damazzy.dto.RetornoDTO;
import br.com.damazzy.negocio.entidade.Produto;
import br.com.damazzy.negocio.entidade.Tamanho;
import br.com.damazzy.negocio.entidade.TipoProduto;
import br.com.damazzy.negocio.persistencia.dao.DamazzyDaoFactory;
import br.com.damazzy.negocio.persistencia.dao.ProdutoDao;
import br.com.damazzy.negocio.persistencia.dao.TamanhoDao;
import br.com.damazzy.negocio.persistencia.dao.TipoProdutoDao;
import br.com.damazzy.negocio.servico.conversor.DamazzyConversor;
import br.com.damazzy.vo.ProdutoVO;

public class ServicoProduto implements ServicoCrudDamazzy<ProdutoVO, RetornoDTO>, DamazzyConversor<Produto, ProdutoVO> {
	
	private static final String LISTA = "lista";
	private static final String LISTA_TIPOS_PRODUTO = "listaTiposProduto";
	private static final String LISTA_TAMANHOS = "listaTamanhos";
	private static final String VO = "vo";
	
	private ProdutoDao produtoDao = DamazzyDaoFactory.getInstance().criarProdutoDao();
	private TipoProdutoDao tipoProdutoDao = DamazzyDaoFactory.getInstance().criarTipoProdutoDao();
	private TamanhoDao tamanhoDao = DamazzyDaoFactory.getInstance().criarTamanhoDao();
	
	public RetornoDTO obterDefinicoesSelecao() throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
	
		List<TipoProduto> tiposProduto = tipoProdutoDao.listar();
		List<ProdutoVO> tiposProdutoVO = converterTipoProdutoEntidadeVO(tiposProduto);
		
		List<Tamanho> tamanhos = tamanhoDao.listar();
		List<ProdutoVO> tamanhosVO = converterTamanhoEntidadeVO(tamanhos);
		
		dto.dados.put(LISTA_TIPOS_PRODUTO, tiposProdutoVO);
		dto.dados.put(LISTA_TAMANHOS, tamanhosVO);
		
		return dto;
	}
	
	public RetornoDTO obterDefinicoes() throws Exception {
		
		RetornoDTO dto = obterDefinicoesSelecao();
		
		return dto;
	}

	public RetornoDTO alterar(ProdutoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
		
		Produto produto = converterVOEntidade(vo);
		produto = produtoDao.alterar(produto);
		
		ProdutoVO voAlterada = converterEntidadeVO(produto);
		
		dto.dados.put(VO, voAlterada);
		
		return dto;
	}

	public RetornoDTO excluir(ProdutoVO vo) throws Exception {
		
		Produto produto = converterVOEntidade(vo);
		produtoDao.excluir(produto.getIdProduto());
		
		return new RetornoDTO();
	}

	public RetornoDTO incluir(ProdutoVO vo) throws Exception {
			
		Produto produto = converterVOEntidade(vo);
		produtoDao.incluir(produto);
		
		return new RetornoDTO();
	}

	public RetornoDTO obter(ProdutoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
			
		Produto produto = converterVOEntidade(vo);
		produto = produtoDao.obter(produto.getIdProduto());
		
		ProdutoVO produtoVO = converterEntidadeVO(produto);
		
		dto.dados.put(VO, produtoVO);
		
		return dto;
	}

	public RetornoDTO pesquisar(ProdutoVO vo) throws Exception {
		
		RetornoDTO dto = new RetornoDTO();
			
		Produto produtoFiltro = converterVOEntidade(vo);
		List<Produto> produtos = produtoDao.pesquisar(produtoFiltro);
		List<ProdutoVO> vos = converterEntidadeVO(produtos);
		
		dto.dados.put(LISTA, vos);
		
		return dto;
	}
	
	public Produto converterVOEntidade(ProdutoVO vo) throws Exception {
		
		Produto produto = new Produto();
		
		produto.setIdProduto(vo.getIdProduto() != null ? new Long(vo.getIdProduto()) : null);
		produto.setCodigo(vo.getCodigo() != null ? vo.getCodigo() : null);
		produto.setNome(vo.getNome() != null ? vo.getNome() : null);
		produto.setDescricao(vo.getDescricao() != null ? vo.getDescricao() : null);
		produto.setValor(vo.getValor() != null ? new BigDecimal(vo.getValor()) : null);
		
		if (vo.getIdTipoProduto() != null) {
			
			TipoProduto tp = new TipoProduto();
			tp.setIdTipoProduto(new Integer(vo.getIdTipoProduto()));
			produto.setTipoProduto(tp);
		}
		
		if (vo.getIdTamanho() != null) {
			
			Tamanho tam = new Tamanho();
			tam.setIdTamanho(new Integer(vo.getIdTamanho()));
			produto.setTamanho(tam);
		}
		
		produto.setQuantidadeEstoque(vo.getQuantidadeEstoque() != null ? new Integer(vo.getQuantidadeEstoque()) : null);
		
		return produto;
	}
	
	public ProdutoVO converterEntidadeVO(Produto produto) throws Exception {
		
		ProdutoVO vo = new ProdutoVO();
		
		vo.setIdProduto(produto.getIdProduto().toString());
		vo.setCodigo(produto.getCodigo());
		vo.setNome(produto.getNome());
		vo.setDescricao(produto.getDescricao());
		vo.setValor(produto.getValor().toString());
		vo.setIdTipoProduto(produto.getTipoProduto().getIdTipoProduto().toString());
		vo.setDescTipoProduto(produto.getTipoProduto().getDescricao());
		vo.setIdTamanho(produto.getTamanho().getIdTamanho().toString());
		vo.setCodTamanho(produto.getTamanho().getCodigo());
		vo.setQuantidadeEstoque(produto.getQuantidadeEstoque().toString());
		
		return vo;
	}
	
	private List<ProdutoVO> converterEntidadeVO(List<Produto> produtos) throws Exception {
		
		List<ProdutoVO> vos = new ArrayList<ProdutoVO>();
		
		for (Produto produto : produtos) {
			vos.add(converterEntidadeVO(produto));
		}
		
		return vos;
	}
	
	private List<ProdutoVO> converterTipoProdutoEntidadeVO(List<TipoProduto> tiposProduto) throws Exception {
		
		List<ProdutoVO> vos = new ArrayList<ProdutoVO>();
		
		for (TipoProduto tp : tiposProduto) {
			vos.add(converterEntidadeVO(tp));
		}
		
		return vos;
	}
	
	private ProdutoVO converterEntidadeVO(TipoProduto entidade) throws Exception {
		
		ProdutoVO vo = new ProdutoVO();
		
		if (entidade != null) {
			vo.setIdTipoProduto(entidade.getIdTipoProduto().toString());
			vo.setDescTipoProduto(entidade.getDescricao());
		}
		
		return vo;
	}
	
	private List<ProdutoVO> converterTamanhoEntidadeVO(List<Tamanho> tamanhos) throws Exception {
		
		List<ProdutoVO> vos = new ArrayList<ProdutoVO>();
		
		for (Tamanho tam : tamanhos) {
			vos.add(converterEntidadeVO(tam));
		}
		
		return vos;
	}
	
	private ProdutoVO converterEntidadeVO(Tamanho entidade) throws Exception {
		
		ProdutoVO vo = new ProdutoVO();
		
		if (entidade != null) {
			vo.setIdTamanho(entidade.getIdTamanho().toString());
			vo.setCodTamanho(entidade.getCodigo());
		}
		
		return vo;
	}
}
